package com.axis2.common.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * @Description: 日期时间工具类
 * @author yemulin
 * @create 2012-8-9 下午5:26:26
 */
public class DateUtil {
	
	/** 日期格式yyyyMMddHHmmss **/
	public static final String FORMAT_TIME = "yyyyMMddHHmmss";
	/** 日期格式yyyyMMdd **/
	public static final String FORMAT_DATE = "yyyyMMdd";

	/**
	 * 
	 * @Description: 将字符串从一种格式转化的
	 * @param source
	 *            日期原串
	 * @param infmt
	 *            日期输入格式
	 * @param outfmt
	 *            日期输出格式
	 * @return 目标日期字符串
	 * @throws ParseException
	 */
	public static String getFmtDate(String source, String infmt, String outfmt)
			throws ParseException {
		// 输入格式
		DateFormat informater = new SimpleDateFormat(infmt);
		// 输出格式
		DateFormat outfomater = new SimpleDateFormat(outfmt);

		return outfomater.format(informater.parse(source));
	}

	/**
	 * 
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @param source
	 *            日期原串 日期或时间格式
	 * @param infmt
	 *            日期输入格式
	 * @param outfmt
	 *            日期输出格式
	 * @param mod
	 *            0原串为 日期，1原串为时间
	 * @return 目标日期字符串
	 * @throws ParseException
	 */
	public static String getFullDateTime(String source, String infmt,
			String outfmt, int mode) throws ParseException {
		// 输入格式
		DateFormat informater = new SimpleDateFormat(infmt);
		// 输出格式
		DateFormat outfomater = new SimpleDateFormat(outfmt);
		// 当前时间
		Calendar current = GregorianCalendar.getInstance();
		// 格式化后的指定时间
		Date date = informater.parse(source);
		Calendar calendar = GregorianCalendar.getInstance();
		calendar.setTime(date);
		// source为日期格式,时间用当前时间
		if (mode == 0) {
			// 设置时间为当前时间
			calendar.set(Calendar.HOUR_OF_DAY,
					current.get(Calendar.HOUR_OF_DAY));
			calendar.set(Calendar.MINUTE, current.get(Calendar.MINUTE));
			calendar.set(Calendar.SECOND, current.get(Calendar.SECOND));

		} else {
			// 时间格式，日期用当前日期
			// 设置日期为当前日期
			calendar.set(Calendar.YEAR, current.get(Calendar.YEAR));
			calendar.set(Calendar.MONTH, current.get(Calendar.MONTH));
			calendar.set(Calendar.DAY_OF_MONTH,
					current.get(Calendar.DAY_OF_MONTH));
		}

		return outfomater.format(calendar.getTime());
	}

	/**
	 * @Description: 给定日期将其格式化为指定的日期时间
	 * @param source
	 *            日期
	 * @param infmt
	 * @param outfmt
	 * @throws ParseException
	 * @return String 日期时间
	 * @throws
	 */
	public static String getFullByDate(String source, String infmt,
			String outfmt) throws ParseException {
		return getFullDateTime(source, infmt, outfmt, 0);
	}

	/**
	 * @Description: 给定时间将其格式化为指定的日期时间
	 * @param source
	 *            时间
	 * @param infmt
	 * @param outfmt
	 * @throws ParseException
	 * @return String 日期时间
	 * @throws
	 */
	public static String getFullByTime(String source, String infmt,
			String outfmt) throws ParseException {
		return getFullDateTime(source, infmt, outfmt, 1);
	}

	/**
	 * @throws ParseException
	 * 
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @param date
	 *            yyyyMMddHHmmss 格式的时间
	 * @return fmt yyyyMMdd或是HHmmss
	 * @throws
	 */
	public static String getBankDate(String date, String fmt)
			throws ParseException {
		return getFmtDate(date, "yyyyMMddHHmmss", fmt);
	}

	/**
	 * @throws ParseException
	 * 
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @param date
	 *            yyyyMMddHHmmss 格式的时间
	 * @return fmt yyyyMMdd或是HHmmss
	 * @throws
	 */
	public static String getFullBankDate() throws ParseException {
		// 输出格式
		DateFormat outfomater = new SimpleDateFormat("yyyyMMddHHmmss");

		return outfomater.format(new Date());
	}

	/**
	 * @throws ParseException
	 * 
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @param dateTime
	 *            yyyyMMddHHmmss
	 * @return String yyyyMMdd
	 * @throws
	 */
	public static String getFullBankDate(String date, String fmt)
			throws ParseException {
		return getFullByDate(date, fmt, "yyyyMMddHHmmss");
	}

	/**
	 * @throws ParseException
	 * 
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @param time
	 *            时间
	 * @return fmt 时间格式
	 * @throws
	 */
	public static String getFullBankTime(String time, String fmt)
			throws ParseException {
		return getFullByTime(time, fmt, "yyyyMMddHHmmss");
	}

	/**
	 * @Description: 获取当前系统日期 格式:yyyy-mm-dd
	 * @return String 日期字符串
	 * @throws
	 */
	public static String getCurrentDate() {
		return getCurrentDate("yyyy-MM-dd");
	}

	/**
	 * @Title: getDate
	 * @Description: 获取当前系统日期 格式:yyyymmdd
	 * @return String
	 * @throws
	 */
	public static String getDate() {
		return getCurrentDate("yyyyMMdd");
	}

	/**
	 * 
	 * @Description: 获取当前系统日期
	 * @param format
	 *            日期格式
	 * @return String 日期字符串
	 * @throws
	 */
	public static String getCurrentDate(String format) {
		return getCurrentDateTimeStr(format);
	}

	/**
	 * @Description: 获取当前系统时间 格式:HH:mm:ss
	 * @return String 时间字符串
	 * @throws
	 */
	public static String getCurrentTime() {
		return getCurrentDate("HH:mm:ss");
	}

	/**
	 * 
	 * @Description: 获取当前系统时间
	 * @param format
	 *            时间格式
	 * @return String 时间字符串
	 * @throws
	 */
	public static String getCurrentTime(String format) {
		return getCurrentDateTimeStr(format);
	}

	/**
	 * @Description: 获取当前系统时间戳 格式:yyyy-mm-dd HH:mm:ss
	 * @return String 时间字符串
	 * @throws
	 */
	public static String getCurrentTimeStamp() {
		return getCurrentDate("yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 
	 * @Description: 获取当前系统时间戳
	 * @param format
	 *            时间格式
	 * @return String 时间字符串
	 * @throws
	 */
	public static String getCurrentTimeStamp(String format) {
		return getCurrentDateTimeStr(format);
	}
	
	/**
	 * @Description : 两个日期日期比较，compareDate 在 baseDate 之前 返回true 否则返回false 
	 * 如：baseDate = 20151205102536，compareDate = 20151205102538 则 返回false
	 * 
	 * @param format String 日期字符串格式
	 * @param baseDate String 被比较的日期
	 * @param compareDate String 比较日期
	 * @return boolean
	 */
	public static boolean before(String format, String baseDate,String compareDate) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
		try {
			Date base = simpleDateFormat.parse(baseDate);
			Date compare = simpleDateFormat.parse(compareDate);
			return compare.before(base);
		} catch (ParseException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	/**
	 * 
	 * @Description: 获取当前日期时间字符串
	 * @param format
	 *            日期时间格式
	 * @return String 日期时间字符串
	 * @throws
	 */
	public static String getCurrentDateTimeStr(String format) {
		DateFormat formater = new SimpleDateFormat(format);
		return formater.format(new Date());
	}

}
